/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package net.easoftware.code.mb;

import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;
import net.easoftware.code.beans.FacesUtil;
import net.easoftware.code.beans.FormUsuario;
import net.easoftware.code.beans.Usuario;
import net.easoftware.code.dao.ActividadesDao;
import net.easoftware.code.util.MySqlConnectionHandler;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

/**
 *
 * @author EADeveloper
 */
@Named
@SessionScoped
public class MbUsuarios implements Serializable {

    @Inject
    ActividadesDao actividadesDao;
    @Inject
    FormUsuario formUsuario;
    @Inject
    Usuario usuario;
    private List<FormUsuario> usuarios;
    private FormUsuario usuarioDel;

    public FormUsuario getUsuarioDel() {
        return usuarioDel;
    }

    public void setUsuarioDel(FormUsuario usuarioDel) {
        this.usuarioDel = usuarioDel;
    }

    public List<FormUsuario> getUsuarios() {
        usuarios = new LinkedList<FormUsuario>();
        Connection c = null;
        try {
            QueryRunner q = new QueryRunner();
            c = MySqlConnectionHandler.getMe().getConnection();
            ResultSetHandler<List<FormUsuario>> h = new BeanListHandler(FormUsuario.class);
            usuarios = q.query(c, "select * from loguser", h);
            for (FormUsuario u : usuarios) {
                u.setPermisoConsulta(u.getTipo().equals(2));
                u.setPermisoTodo(u.getTipo().equals(1));
            }
        } catch (SQLException ex) {
            Logger.getLogger(MbUsuarios.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            if (c != null) {
                try {
                    c.close();
                } catch (SQLException ex) {
                    Logger.getLogger(MbUsuarios.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
        return usuarios;
    }

    public void validarUsuario() {
        List<Usuario> lcUsr = new LinkedList<Usuario>();
        Connection c = null;
        try {
            QueryRunner q = new QueryRunner();
            c = MySqlConnectionHandler.getMe().getConnection();
            ResultSetHandler<List<Usuario>> h = new BeanListHandler(Usuario.class);
            lcUsr = q.query(c, "select * from loguser where usuario like ?", h, usuario.getUsuario());
            if (lcUsr.isEmpty()) {
                FacesUtil.addMessagesError("El usuario es invalido");
            } else {
                if (!lcUsr.get(0).getClave().equalsIgnoreCase(usuario.getClave())) {
                    FacesUtil.addMessagesError("La clave es incorrecta");
                } else {
                    BeanUtils.copyProperties(usuario, lcUsr.get(0));
                    usuario.setLoged(true);
                    usuario.setPermisoConsulta(usuario.getTipo().equals(2));
                    usuario.setPermisoTodo(usuario.getTipo().equals(1));
                }
            }
        } catch (Exception ex) {
            Logger.getLogger(MbUsuarios.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            if (c != null) {
                try {
                    c.close();
                } catch (SQLException ex) {
                    Logger.getLogger(MbUsuarios.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }

    public void setUsuarios(List<FormUsuario> usuarios) {
        this.usuarios = usuarios;
    }

    public void saveRow(org.primefaces.event.RowEditEvent e) {
        try {
            FormUsuario u = ((FormUsuario) e.getObject());
            BeanUtils.copyProperties(formUsuario, u);
            actionActualizar();
        } catch (Exception ex) {
            Logger.getLogger(MbUsuarios.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void actionGuardar() {
        StringBuilder b = new StringBuilder("insert into loguser(clave,tipo,usuario)").append(" values (?,?,?)");
        guardar(b.toString(), false);
        actividadesDao.registrarAction("Agregar Usuario ", formUsuario.getUsuario(), usuario.getUsuario(), MySqlConnectionHandler.getMe().getConnection());
        actionLimpiar();

    }

    public void actionActualizar() {
        StringBuilder b = new StringBuilder("update loguser set clave=?,tipo=? ").append(" where usuario=?");
        guardar(b.toString(), false);
        actividadesDao.registrarAction("Actualizar Usuario ", formUsuario.getUsuario(), usuario.getUsuario(), MySqlConnectionHandler.getMe().getConnection());
    }

    public void actionEliminar() {
        try {
            String us = FacesUtil.getRequestParam("usuario");
            usuarioDel = new FormUsuario();
            usuarioDel.setUsuario(us);
            usuarioDel = usuarios.get(usuarios.indexOf(usuarioDel));
            BeanUtils.copyProperties(formUsuario, usuarioDel);
            StringBuilder b = new StringBuilder("delete from loguser where usuario=?");
            guardar(b.toString(), true);
            actividadesDao.registrarAction("Eliminar Usuario ", usuarioDel.getUsuario(), usuario.getUsuario(), MySqlConnectionHandler.getMe().getConnection());
        } catch (IllegalAccessException ex) {
            Logger.getLogger(MbUsuarios.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvocationTargetException ex) {
            Logger.getLogger(MbUsuarios.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void actionLimpiar() {
        try {
            BeanUtils.copyProperties(formUsuario, new FormUsuario());
        } catch (IllegalAccessException ex) {
            Logger.getLogger(MbUsuarios.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvocationTargetException ex) {
            Logger.getLogger(MbUsuarios.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     *
     * @param cmd
     * @param delete
     */
    public void guardar(String cmd, boolean delete) {
        Connection c = null;
        try {
            QueryRunner q = new QueryRunner();
            c = MySqlConnectionHandler.getMe().getConnection();
            if (delete) {
                q.update(c, cmd, formUsuario.getUsuario());
            } else {
                q.update(c, cmd, formUsuario.getClave(), formUsuario.getTipo(), formUsuario.getUsuario());
            }

        } catch (SQLException ex) {
            Logger.getLogger(MbUsuarios.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            if (c != null) {
                try {
                    c.close();
                } catch (SQLException ex) {
                    Logger.getLogger(MbUsuarios.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }

    /**
     *
     * @param cmd
     * @param delete
     * @param usuario
     */
    public void guardar(String cmd, boolean delete, Usuario usuario) {
        Connection c = null;
        try {
            QueryRunner q = new QueryRunner();
            c = MySqlConnectionHandler.getMe().getConnection();
            if (delete) {
                q.update(c, cmd, usuario.getUsuario());
            } else {
                q.update(c, cmd, usuario.getClave(), usuario.getTipo(), usuario.getUsuario());
            }

        } catch (SQLException ex) {
            Logger.getLogger(MbUsuarios.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            if (c != null) {
                try {
                    c.close();
                } catch (SQLException ex) {
                    Logger.getLogger(MbUsuarios.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }
}
